package main

// 完成api服务后，我们当然可以使用传统的nginx反向代理，通过配置文件对外暴露api，但是micro工具包为我们提供了更方便的方式。
//再次启动micro 网关，这次我们加一个参数--header=http他会将网关变为一个基于服务发现的http代理
// micro api --handler=http
// 现在我们访问micro网关的8080端口，不需要任何额外配置，http接口被自动发现并代理

import (
	hystrixGo "github.com/afex/hystrix-go/hystrix"
	"github.com/gin-gonic/gin"
	"github.com/micro/go-micro/v2"
	"github.com/micro/go-micro/v2/registry"
	"github.com/micro/go-micro/v2/registry/etcd"
	"github.com/micro/go-micro/v2/web"
	"github.com/micro/go-plugins/wrapper/trace/opentracing/v2"
	"log"
	"todolist/common/tracer"
	"todolist/task-api/handler"

	//"github.com/micro/go-plugins/wrapper/breaker/hystrix/v2"
	"todolist/task-api/wrapper/breaker/hystrix"
	pb "todolist/task-srv/proto/task"
)

const (
	ServerName = "go.micro.api.task"
	JaegerAddr = "139.155.239.206:6831"
)

func main() {
	etcdRegister := etcd.NewRegistry(
		registry.Addrs("139.155.239.206:2379"),
	)

	//  WrapClient() client中间件,注意插件是注册在调用服务上而不是web服务上
	jaegerTracer, closer, err := tracer.NewJaegerTracer(ServerName, JaegerAddr)
	if err != nil {
		log.Fatal(err)
	}
	defer closer.Close()

	// 之前我们使用client.DefaultClient注入到pb.NewTaskService中
	// 现在改为标准的服务创建方式创建服务对象
	// 但这个服务并不真的运行（我们并不调用他的Init()和Run()方法）
	// 如果是task-srv这类本来就是用micro.NewService服务创建的服务
	// 则直接增加包装器，不需要再额外新增服务
	app := micro.NewService(
		micro.Name("go.micro.client.task"),
		micro.Registry(etcdRegister),
		micro.WrapClient(
			// 引入hystrix包装器
			hystrix.NewClientWrapper(),
			// 在WrapClient中引入jaeger
			opentracing.NewClientWrapper(jaegerTracer),
		),
	)

	// 自定义全局默认超时时间和最大并发数
	hystrixGo.DefaultSleepWindow = 200
	hystrixGo.DefaultMaxConcurrent = 3

	// 针对指定服务接口使用不同熔断配置
	// 第一个参数name=服务名.接口.方法名，这并不是固定写法，而是因为官方plugin默认用这种方式拼接命令name
	// 之后我们自定义wrapper也同样使用了这种格式
	// 如果你采用了不同的name定义方式则以你的自定义格式为准
	hystrixGo.ConfigureCommand("go.micro.service.task.search",
		hystrixGo.CommandConfig{
			MaxConcurrentRequests: 50,
			Timeout:               2000,
		})

	//cli := pb.NewTaskService("go.micro.service.task", client.DefaultClient)
	taskService := pb.NewTaskService("go.micro.service.task", app.Client())

	webHandler := gin.Default()
	service := web.NewService(
		web.Name("go.micro.api.task"),
		web.Address(":8888"),
		web.Handler(webHandler),
		web.Registry(etcdRegister),
	)

	// 配置web路由
	handler.Router(webHandler, taskService)

	service.Init()
	if err := service.Run(); err != nil {
		log.Fatal(err)
	}
}
